#include "gestao.h"

using namespace std;

/**
* Classe cliente
* Constructor da classe
*/
Cliente::Cliente(string nome, uint idade, char sexo, float peso, float altura):
		nome(nome), idade(idade), sexo(sexo), peso(peso), altura(altura), IMC(NULL) {

	vector<Alimento*> PAlmoco;
	vector<Alimento*> Almoco;
	vector<Alimento*> Jantar;
	vector<Alimento*> RefExtra;

	vector<vector<Alimento*> > segunda;
	vector<vector<Alimento*> > terca;
	vector<vector<Alimento*> > quarta;
	vector<vector<Alimento*> > quinta;
	vector<vector<Alimento*> > sexta;
	vector<vector<Alimento*> > sabado;
	vector<vector<Alimento*> > domingo;

	segunda.push_back(PAlmoco);
	segunda.push_back(Almoco);
	segunda.push_back(Jantar);
	segunda.push_back(RefExtra);

	terca.push_back(PAlmoco);
	terca.push_back(Almoco);
	terca.push_back(Jantar);
	terca.push_back(RefExtra);

	quarta.push_back(PAlmoco);
	quarta.push_back(Almoco);
	quarta.push_back(Jantar);
	quarta.push_back(RefExtra);

	quinta.push_back(PAlmoco);
	quinta.push_back(Almoco);
	quinta.push_back(Jantar);
	quinta.push_back(RefExtra);

	sexta.push_back(PAlmoco);
	sexta.push_back(Almoco);
	sexta.push_back(Jantar);
	sexta.push_back(RefExtra);

	sabado.push_back(PAlmoco);
	sabado.push_back(Almoco);
	sabado.push_back(Jantar);
	sabado.push_back(RefExtra);

	domingo.push_back(PAlmoco);
	domingo.push_back(Almoco);
	domingo.push_back(Jantar);
	domingo.push_back(RefExtra);


	dieta.push_back(segunda);
	dieta.push_back(terca);
	dieta.push_back(quarta);
	dieta.push_back(quinta);
	dieta.push_back(sexta);
	dieta.push_back(sabado);
	dieta.push_back(domingo);
}
/**
* Classe cliente
* Destructor da classe
*/
Cliente::~Cliente() {
}
/**
* Classe cliente
* Devolve o nome do cliente
*/
string Cliente::getNome() const {
	return nome;
}
/**
* Classe cliente
* Devolve a idade do cliente
*/
uint Cliente::getIdade() const {
	return idade;
}
/**
* Classe cliente
* Devolve o sexo do cliente
*/
char Cliente::getSexo() const {
	return sexo;
}
/**
* Classe cliente
* Devolve o peso do cliente
*/
float Cliente::getPeso() const {
	return peso;
}
/**
* Classe cliente
* Devolve a altura do cliente
*/
float Cliente::getAltura() const {
	return altura;
}
/**
* Classe cliente
* Devolve o número de refeições do cliente
*/
uint Cliente::getNRefeicoes() const {
	return nRefeicoes;
}
/**
* Classe cliente
* Devolve o vector dos alimentos da dieta do cliente
*/
vector<vector<vector <Alimento*> > > Cliente::getDieta() const
{
	return dieta;
}

/**
* Classe cliente
* Define o nome do cliente
*/
void Cliente::setNome(string nome){
	this->nome = nome;
}
/**
* Classe cliente
* Define a idade do cliente
*/
void Cliente::setIdade(uint idade){
	this->idade = idade;
}
/**
* Classe cliente
* Define o sexo do cliente
*/
void Cliente::setSexo(char sexo){
	this->sexo = sexo;
}
/**
* Classe cliente
* Define o peso do cliente
*/
void Cliente::setPeso(float peso) {
	this->peso = peso;
}
/**
* Classe cliente
* Define a altura do cliente
*/
void Cliente::setAltura(float altura){
	this->altura = altura;
}

/**
* Classe cliente
* Define o numero de refeições do cliente
*/
void Cliente::setNRefeicoes(uint nRefeicoes) {
	this->nRefeicoes = nRefeicoes;
}

/**
* Classe cliente
* Calcula o indice de massa corporal do cliente
*/
float Cliente::calculaIMC() {
	float imc;

	imc = peso / (altura * altura);

	if (imc <= 18.5)
	{
		magreza = true;
		saudavel = false;
		pesoExcesso = false;
		obesidade = false;
		obesidadeSevera = false;
		obesidadeMorbida = false;
	}
	else if (imc <= 24.9)
	{
		magreza = false;
		saudavel = true;
		pesoExcesso = false;
		obesidade = false;
		obesidadeSevera = false;
		obesidadeMorbida = false;
	}
	else if (imc <= 29.9)
	{
		magreza = false;
		saudavel = false;
		pesoExcesso = true;
		obesidade = false;
		obesidadeSevera = false;
		obesidadeMorbida = false;
	}
	else if (imc <= 34.9)
	{
		magreza = false;
		saudavel = false;
		pesoExcesso = false;
		obesidade = true;
		obesidadeSevera = false;
		obesidadeMorbida = false;
	}
	else if (imc <= 39.9)
	{
		magreza = false;
		saudavel = false;
		pesoExcesso = false;
		obesidade = false;
		obesidadeSevera = true;
		obesidadeMorbida = false;
	}
	else if (imc >= 40.0)
	{
		magreza = false;
		saudavel = false;
		pesoExcesso = false;
		obesidade = false;
		obesidadeSevera = false;
		obesidadeMorbida = true;
	}

	IMC = imc;
	return imc;
}
/**
* Classe cliente
* Faz overload ao operador == para verificar se um cliente é igual ao outro
*/
bool Cliente::operator == (Cliente cliente) const{
	if (this->nome == cliente.nome)
		return true;

	return false;
}
/**
* Classe cliente
* Adiciona o alimento ao pequeno-almçoço do cliente
*/
void Cliente::adicionaPAlmoco(Alimento *x, uint dia)
{
	dia--;
	dieta[dia][0].push_back(x);

}
/**
* Classe cliente
* Adiciona o alimento ao almçoço do cliente
*/
void Cliente::adicionaAlmoco(Alimento *x, uint dia)
{
	dia--;
	dieta[dia][1].push_back(x);

}
/**
* Classe cliente
* Adiciona o alimento ao jantar do cliente
*/
void Cliente::adicionaJantar(Alimento *x, uint dia)
{
	dia--;
	dieta[dia][2].push_back(x);
}
/**
* Classe cliente
* Adiciona o alimento à refeiçao extra do cliente
*/
void Cliente::adicionaRefExtra(Alimento *x, uint dia)
{
	dia--;
	dieta[dia][3].push_back(x);
}

/**
* Classe cliente
* Lista os alimentos do cliente por dia e refeiçao
*/
void Cliente::listaAlimentos()
{
	cout << "..." << endl;
	for(size_t i = 0; i < dieta.size(); i++){
		if(i == 0)
			cout << "#### Segunda-feira ####\n";
		if(i == 1)
			cout << "#### Terca-feira ####\n";
		if(i == 2)
			cout << "#### Quarta-feira ####\n";
		if(i == 3)
			cout << "#### Quinta-feira ####\n";
		if(i == 1)
			cout << "#### Sexta-feira ####\n";
		if(i == 1)
			cout << "#### Sabado ####\n";
		if(i == 1)
			cout << "#### Domingo ####\n";

		for(size_t k = 0; k < dieta[i].size(); k++){
			for(size_t j = 0; j < dieta[i][k].size();j++){




				cout << dieta[i][k][j]->getID() << " - " << dieta[i][k][j]->getNome() << ", " << dieta[i][k][j]->getCalorias() << " calorias." << endl;

				}
			}
		if(calculaCalorias(i) > 0)
			cout << calculaCalorias(i) << " calorias no total." << endl;
		}
	}

/**
* Classe cliente
* Remove um alimento da dieta do cliente
*/
void Cliente::removeAlimento( uint ali){
	for(size_t i = 0; i < dieta.size(); i++){
		for(size_t k=0; k < dieta[i].size(); k++){
			for(size_t j = 0; j < dieta[i][k].size(); j++){
				if(dieta[i][k][j]->getID() == ali){
				dieta[i][k].erase(dieta[i][k].begin()+j);
				}
			}
		}
	}
}
/**
* Classe cliente
* Calcula as calorias total do dia do cliente
*/
uint Cliente::calculaCalorias(uint dia)
{
	uint cont = 0;

	for(size_t i = 0; i < dieta[dia].size(); i ++)
	{
		for(size_t j = 0; j < dieta[dia][i].size(); j++)
		{
			cont += dieta[dia][i][j]->getCalorias();
		}
	}
	return cont;
}
